www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/mapedit_source/dialog/ToolDlg.cpp

    //Download by http://www.NewXing.com
// ToolDlg.cpp : implementation file
//

#include "stdafx.h"
#include "..\\MapEdit.h"
#include "ToolDlg.h"
#include "..\\Ddfunc.h"
#include "..\\MapEditView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

WORD nCurrentTab;	//当前资源所在的Tab
WORD nSelPic;		//选择的资源
int izoom = 1;		//全图显示放大的倍数
CView *pView;		//指向MapEditView的指针
bool IsLButtonDown = false;	//左键是否按下
bool IsZoomDown = false;    //按下Zoom放大缩小按钮
RECT rShowPic;
_SurfaceCell cSelSurface;
_ObjCell cSelObj;
char cPic_Path[MAX_PATH];

extern float fRealZoom;

extern CString* cSourPath;
extern CString* cObjPath[3];
extern int nSource;
extern int nObj[3];
extern int SCREEN_WIDTH;
extern int SCREEN_HEIGHT;
extern CDdfunc GameDd;
extern CPoint g_ptScrollPos;
extern RECT client;
extern bool IsFirstShowSPic;

/////////////////////////////////////////////////////////////////////////////
// CToolDlg dialog


CToolDlg::CToolDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CToolDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CToolDlg)
	//}}AFX_DATA_INIT
	m_imageList=new CImageList;
	nCurrentTab=0;
}


void CToolDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CToolDlg)
	DDX_Control(pDX, IDC_MOUSE_POINT, m_mouse_point);
	DDX_Control(pDX, IDC_MAP_SIZE, m_map_size);
	DDX_Control(pDX, IDC_SMALLPIC, m_smallpic);
	DDX_Control(pDX, IDC_TAB, m_Tab);
	DDX_Control(pDX, IDC_PIC_LIST, m_List);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CToolDlg, CDialog)
	//{{AFX_MSG_MAP(CToolDlg)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, OnSelchangeTab)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_PIC_LIST, OnItemchangedPicList)
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_ZOOMUP, OnZoomup)
	ON_BN_CLICKED(IDC_ZOOMDOWN, OnZoomdown)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CToolDlg message handlers

//当Tab有变化时,相应改变资源列表
void CToolDlg::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int i;
	ClearListItem();
	if(m_Tab.GetCurSel() == 0)
	{
		for (i=0;i<nSource;i++)
			LoadListItem(i,cSourPath[i]);
	}
	else if(m_Tab.GetCurSel() == 1)
	{
		for (i=0;i<nObj[0];i++)
			LoadListItem(i,cObjPath[0][i]);
	}
	else if(m_Tab.GetCurSel() == 2)
	{
		for (i=0;i<nObj[1];i++)
			LoadListItem(i,cObjPath[1][i]);
	}
	else if(m_Tab.GetCurSel() == 3)
	{
		for (i=0;i<nObj[2];i++)
			LoadListItem(i,cObjPath[2][i]);
	}
	*pResult = 0;
}

//初始化工具对话框
BOOL CToolDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	TC_ITEM *m_pTCItem;
	m_pTCItem = new TC_ITEM;
	m_pTCItem->mask = TCIF_TEXT;
	m_pTCItem->pszText = "地板";
	m_Tab.InsertItem(0, m_pTCItem);
	m_pTCItem->pszText = "静态";
	m_Tab.InsertItem(1, m_pTCItem);
	m_pTCItem->pszText = "动态";
	m_Tab.InsertItem(2, m_pTCItem);
	m_pTCItem->pszText = "转变";
	m_Tab.InsertItem(3, m_pTCItem);

	CSize sz(70,60);
	m_List.SetIconSpacing(sz);
	m_List.SetBkColor(RGB(255,255,255));
	
	m_imageList->Create(32, 32, ILC_COLOR24 , 0, 128);
	m_List.SetImageList(m_imageList,LVSIL_NORMAL);
	GetCurrentDirectory(MAX_PATH,cPic_Path);
	int i;
	for (i=0;i<nSource;i++)
		LoadListItem(i, cSourPath[i]);

	nSelPic = 0;
	nCurrentTab = 0;
	cSelSurface.nID = 0;
	cSelSurface.nHeight = 0;
	cSelSurface.nPass = 1;
	cSelSurface.nEventType = 0;
	cSelSurface.nEvent = 0;
	GetDlgItem(IDC_SMALLPIC)->GetClientRect(&rShowPic);
	GameDd.InitDirectDraw(m_hWnd);
	GameDd.GameMap.ResizeMap(32,32, cSelSurface);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
//添加资源列表项目
void CToolDlg::LoadListItem(int nItem, CString str)
{
	CBitmap *bmp;
	HBITMAP hp;
	int i=0,j=0,k=0;
	char filename[32];
	char result[MAX_PATH];
	strcpy(result, cPic_Path);
	strcat(result,"\\resource\\");
	i = str.Find('\\', 0);
	for(k = 0; k <= i; k++)
		filename[k] = str[k];
	filename[k] = '\0';
	strcat(result,filename);
	itoa(nItem,filename,10);
	strcat(result,filename);
	strcat(result,".bmp");
	hp=(HBITMAP)LoadImage( NULL, result, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
	bmp=CBitmap::FromHandle(hp);
	m_imageList->Add(bmp, RGB(0, 0, 0));
	i ++;
	while(str[i] != '.')
		filename[j++] = str[i++];
	filename[j] = '\0';
	int h = m_imageList->GetImageCount();
	m_List.InsertItem(nItem,filename,m_imageList->GetImageCount()-1);
}
//清楚资源列表项目
void CToolDlg::ClearListItem()
{
	if (m_imageList)
	{
		delete m_imageList;
		m_imageList = NULL;
	}
	m_imageList=new CImageList;
	m_imageList->Create(32, 32, ILC_COLOR24 , 0, 128);
	m_List.SetImageList(m_imageList,LVSIL_NORMAL);
	m_List.DeleteAllItems();
}

//当选择资源时,处理所选的资源
void CToolDlg::OnItemchangedPicList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_PIC_LIST);
	int nSelected = pNMListView->iItem;
	if(nSelected >= 0)
	{
		nSelPic = nSelected;
		nCurrentTab = m_Tab.GetCurSel();
	}
	if(nCurrentTab == 0)
	{
		cSelSurface.nID = nSelected;
		cSelSurface.nHeight = 0;
		cSelSurface.nPass = 1;
		cSelSurface.nEvent = 0;
		cSelSurface.nEventType = 0;
		cSelSurface.nUseTranSition = 1;
		cSelSurface.res = 0;
	}
	else
	{
		cSelObj.nID = nSelected;
		cSelObj.nRealY = 0;
		cSelObj.nType = nCurrentTab;
		cSelObj.res = 0;
	}
	*pResult = 0;
	((CMapEditView*)pView)->InvalidateRect(NULL,false);
}

void CToolDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	if (m_imageList)
		delete m_imageList;
}


void CToolDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	GetDlgItem(IDC_PIC_LIST)->ShowWindow(SW_SHOW);
	// Do not call CDialog::OnPaint() for painting messages
}


void CToolDlg::OnZoomup() 
{
	// TODO: Add your control notification handler code here
	if(fRealZoom > 2)
		izoom *= 2;
	IsZoomDown = true;
	IsFirstShowSPic = true;
	((CMapEditView*)pView)->InvalidateRect(&rShowPic);
}

void CToolDlg::OnZoomdown() 
{
	// TODO: Add your control notification handler code here
	if(izoom > 1)
		izoom /= 2;
	IsZoomDown = true;
	IsFirstShowSPic = true;
	((CMapEditView*)pView)->InvalidateRect(&rShowPic);
}

void CToolDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CPoint cClientCenterPoint;
	RECT rect = GameDd.GetSrect( );
	if((point.x>8)&&(point.x<rShowPic.right+8)&&(point.y>8)&&(point.y<rShowPic.bottom+8))
	{
		cClientCenterPoint.x = (long)((point.x-8)*fRealZoom-client.right/2+rect.left);
		if(cClientCenterPoint.x < 0)
			cClientCenterPoint.y = 0;
		cClientCenterPoint.y = (long)((point.y-8)*fRealZoom-client.bottom/2+rect.top);
		if(cClientCenterPoint.y < 0)
			cClientCenterPoint.y = 0;
		((CMapEditView*)pView)->ScrollToPosition(cClientCenterPoint);
		((CMapEditView*)pView)->InvalidateRect(&rShowPic);
	}
	IsLButtonDown = true;
	CDialog::OnLButtonDown(nFlags, point);
}

void CToolDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CPoint cClientCenterPoint;
	RECT rect = GameDd.GetSrect( );
	if(IsLButtonDown)
	{
		if((point.x>8)&&(point.x<rShowPic.right+8)&&(point.y>8)&&(point.y<rShowPic.bottom+8))
		{
			cClientCenterPoint.x = (long)((point.x-8)*fRealZoom-client.right/2+rect.left);
			if(cClientCenterPoint.x < 0)
				cClientCenterPoint.y = 0;
			cClientCenterPoint.y = (long)((point.y-8)*fRealZoom-client.bottom/2+rect.top);
			if(cClientCenterPoint.y < 0)
				cClientCenterPoint.y = 0;
			((CMapEditView*)pView)->ScrollToPosition(cClientCenterPoint);
			((CMapEditView*)pView)->InvalidateRect(&rShowPic);
		}
	}
	CDialog::OnMouseMove(nFlags, point);
}

void CToolDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	IsLButtonDown = false;
	CDialog::OnLButtonUp(nFlags, point);
}